// modules/orderPayModule/pages/order/detail/detail.js
import { 
		reqOrderAddress,
		reqOrderInfo,
		reqBuyNowgGoods,
		reqSubmitOrder,
		reqPrePayInfo,
		reqPayStatus
	} from '../../../api/orderpay'
// npm i miniprogram-licia --save 防抖功能，作用：防止同一时间进行多次请求；
// 功能：在某一段时间，只执行最后一次请求；参数（要调用的函数，限制的时间段）；
import { debounce } from 'miniprogram-licia'


// 获取应用实例
const app = getApp()
// 导入格式化时间的方法
import { formatTime } from '../../../utils/formatTime'
// 导入 async-validator 对参数进行验证
import Schema from 'async-validator'


Page({
  data: {
    buyName: '', // 订购人姓名
    buyPhone: '', // 订购人手机号
    deliveryDate: '', // 期望送达日期
    blessing: '', // 祝福语
		show: false, // 期望送达日期弹框
		orderAddress : {}, // 收货地址
		orderInfo : {}, // 订单商品详情
    minDate: new Date().getTime()
  },

	// 处理提交订单
	 submitOrder:debounce (async function () {
		// 需要从 data 中解构数据
		const {
				buyName ,buyPhone ,deliveryDate ,
				blessing ,orderAddress ,orderInfo
			} = this.data;
		// 需要根据接口要求组织请求参数
		const params = {
			buyName,
			buyPhone,
			cartList: orderInfo.cartVoList,
			deliveryDate,
			remarks : blessing,
			userAddressId : orderAddress.id
		};
		// 对请求参数进行验证
		// 返回的结果是 {valid: Boolean}
		const { valid } = await this.validatorPerson(params)
		console.log('提交订单验证结果',valid)

		//如果请求参数验证失败，直接 return 不执行后续的逻辑
		if(!valid) return ;

		// 调用接口，创建平台订单
		const res = await reqSubmitOrder(params)
		console.log('创建订单返回的信息',res)
		// code: 200, message: "成功", data: "1721638882056"
		if(res.code === 200) {
			// 在平台订单创建成功以后，需要将服务器、后端返回的订单编号挂载到页面实例上
			this.orderNo = res.data;

			//	获取预付单信息、支付参数
			this.advancePay();
		}

	},500),

	//	获取预付单信息、支付参数
	async advancePay () {
		try {
			const payParams = await reqPrePayInfo(this.orderNo);

			if(payParams.code === 200) {
				// 说明支付成功
				console.log('支付参数信息',payParams)
				// {code: 200, message: "成功", data: {…}}
				// nonceStr: "a9SKU7Ht3pqZ0ma5"
				// package: "prepay_id=wx2217102532940428d0c17aa7fc91290001"
				// paySign: "4D1C499AAC31436F8228C47D6545B2C6"
				// signType: "MD5"
				// timeStamp: "1721639425397"

				// 调用 wx.requestPayment 发起微信支付
				const payInfo = await wx.requestPayment(payParams.data)

				console.log('是否支付成功信息',payInfo)
				// 获取支付结果
				if(payInfo.message === 'requestPayment:ok') {
					const payStatus = await reqPayStatus(this.orderNo);
					if(payStatus === 200){
						wx.redirectTo({
							url: '/modules/orderPayModule/pages/order/list/list',
							success : () => {
								wx.toast({
									title : '支付成功',
									icon : 'success'
								})
							}
						})
					}
				}
			}	
		} catch (error) {
			console.log('支付失败信息',error)
			wx.toast({
				title : '支付失败',
				icon : 'error'
			})
		}

	},

	// 对收货人、订购人信息进行验证
	validatorPerson (params) {
		// 验证订购人，是否只包含大小写字母、数字和中文字符
		const nameRegExp = '^[a-zA-Z\\d\\u4e00-\\u9fa5]+$'
		// 验证订购人，是否符合中国大陆手机号码的格式
		const phoneReg = '^1(?:3\\d|4[4-9]|5[0-35-9]|6[67]|7[0-8]|8\\d|9\\d)\\d{8}$'
		const rules = {
			// 验证收货人，是否只包含大小写字母、数字和中文字符
			userAddressId : [
				{required : true, message : '请选择收货地址'}
			],
			buyName : [
				{required : true, message : '请输入订购人姓名'},
				{pattern : nameRegExp ,message : '订购人姓名不合法'} 
			],
			buyPhone : [
				{required : true, message : '请输入订购人手机号'},
				{pattern : phoneReg , message : "订购人手机号不合法"}
			],
			deliveryDate : [
				{required : true, message : '请选择送达日期'},
			]
		}

		// 传入验证规则进行实例化
		const validator = new Schema(rules);

		// 调用实例方法对请求参数进行验证
		// 注意:我们希望将验证结果通过Promise 的形式返回给函数的调用者
		return  new Promise ( (resolve) => {
			validator.validate (params, (errors) => {
				if(errors) {
					// 如果验证失败，需要给用户进行提示
					wx.toast( {title : errors[0].message} )
					// 如果属性值是 false , 说明验证失败
					resolve({valid: false})
				} else {
					// 如果属性值是 true , 说明验证成功
					resolve({valid: true})
				}
			})
		})
	},

  // 选择期望送达日期
  onShowDateTimerPopUp() {
    this.setData({
      show: true
    })
  },

  // 期望送达日期确定按钮
  onConfirmTimerPicker(event) {

		// 使用 Vant 提供的时间选择组件，获取的时间是时间戳
		// 需要将时间戳转换成年月日在页面中进行展示才可以
		// 可以调用小程序给提供的日期格式化方法对时间进行转换
		// console.log('期望送达日期',event.detail,formatTime(new Date(event.detail)))
		const timeRes = formatTime(new Date(event.detail));
		// formatTime 方法接收JS的日期对象作为参数
		// 因此需要将时间戳转换成JS的日期对象
    this.setData({
			show: false,
			deliveryDate : timeRes
    })
  },

  // 期望送达日期取消按钮 以及 关闭弹框时触发
  onCancelTimePicker() {
    this.setData({
      show: false,
      minDate: new Date().getTime(),
      currentDate: new Date().getTime()
    })
  },

  // 跳转到收货地址
  toAddress() {
    wx.navigateTo({
      url: '/modules/settingModule/pages/address/list/index'
    })
	},
	
	// 获取订单页面的收获地址
	async getAddress () {
		// TODO 在订单结算页面 切换收货地址
		// 判断全局共享的 address 中是否存在数据，
		// 如果存在数据，就需要从全局共享的 address 中取到数据进行赋值
		const addressId = app.globalData.address.id;

		if(addressId) {
			this.setData({
				orderAddress : app.globalData.address
			})

			return
		}

		// 如果全局共享的 address 中没有数据，就需要调用接口获取收货地址数据进行渲染
		const {data : orderAddress} = await reqOrderAddress();
		// console.log('订单列表时查询的收货地址',res)
		this.setData({orderAddress})
		
	},
	
	// 获取订单详情数据
	async getOrderInfo(){


		const {goodsId,blessing} = this.data;

		// 如果存在商品Id，说明是从立即购买进入的结算页面。
		// 没有商品Id，说明是从购物车进入的结算页面。

		const {data : orderInfo} = goodsId ? 
							await reqBuyNowgGoods({goodsId,blessing}) : 
							await reqOrderInfo();
		console.log('订单详情数据',orderInfo);

		// 判断是否存在祝福语
		// 如果需要购买的是多个商品，筛选第一个存在祝福语的商品进行赋值
		const orderGoods =  orderInfo.cartVoList.find((item) => item.blessing !== '')
		// 判断是否筛选成功,如果 orderGoods 是 undefined 不进行赋值	
		this.setData ({
			orderInfo,
			// 如果商品都没有祝福语，则返回的是 undefined ,进行取反，赋值为 ''。
			blessing : !orderGoods ? '' : orderGoods.blessing
		})
	},

	// 在页面加载的时候触发
	onLoad(options) {
		//获取立即购买商品传递的参数
		// console.log('其他页面传递过来的参数',options)
		// this.setData({...options}) 作用：如果data里面有相同的字段就会赋值给相同的字段
		// 没有相同的字段就会将 options里面的字段添加到 data里面。
		this.setData({...options})
	},

	// 在页面展示的时候进行触发
	onShow() {
		// 获取收获地址
		this.getAddress();

		// 获取需要下单的商品详细信息
		this.getOrderInfo();
	},

	onUnload () {
		// 在页面销毁以后，需要将全局共享的 address 也进行重置
		// 如果用户再次进入结算支付页面，需要从接口地址获取默认的收货地址进行渲染
		app.globalData.address = {};
	}
})
